#-*- coding: utf-8 -*-

"""
    PyJICK: Python Intelligent Control KIT
    Copyright (C) 2012  Jack Krieger
    This file is part of PyJICK.

    See the file LICENSE for copying permission.
"""

import os
import re
import database
import pkg_resources

class PyJICK:

	def __init__(self, nest, room, nick):
		self.room = room
		print
		print "Hello, I'm " + unicode(self)
		
		self.nick = nick

		self.commands = {}
		self.message = []
		self.presence = []
		self.query = []
		
		self.__nest = nest
		#print eggs

		self.db = database.Database(os.path.join('data', room + '.db'))
		
		self.settings = self.db.table('settings', ('context', 'option', 'value'))
		self.users = self.db.table('users', ('context', 'user', 'option', 'value'))

		for egg in nest.eggs:
			# в этом месте мы можем отсеять отключенные модули и загрузить только включенные

			eggmap = pkg_resources.get_entry_map(egg)

			# загрузка обработчиков сообщений
			if 'message' in eggmap:
				try:
					for handler in eggmap['message']:
						self.message.append(eggmap['message'][handler].load())
				except ImportError, e:
					print unicode(e) + ' in ' + egg.project_name
				
			# загрузка обработчиков статуса
			if 'presence' in eggmap:
				try:
					for handler in eggmap['presence']:
						self.presence.append(eggmap['presence'][handler].load())
				except ImportError, e:
					print unicode(e) + ' in ' + egg.project_name
			
			# загрузка обработчиков запросов iq
			if 'query' in eggmap:
				try:
					for handler in eggmap['query']:
						self.query.append(eggmap['query'][handler].load())
				except ImportError, e:
					print unicode(e) + ' in ' + egg.project_name

			# загрузка обработчиков команд
			if 'command' in eggmap:
				try:
					for handler in eggmap['command']:
						self.commands[handler] = eggmap['command'][handler].load()
				except ImportError, e:
					print unicode(e) + ' in ' + egg.project_name


		# подготовка регулярных выражений для распознавания команд
		pattern = r'^.(?P<command>%s\b)\s?(?P<argument>.*)' % ('|'.join(self.commands.keys()))
		#print '%s' % pattern
		self.keywords = re.compile(pattern, re.UNICODE|re.DOTALL)



	def join(self, room, nick, password):
		pass



	def leave(self):
		pass
		self.__nest.xmpp.disconnect(wait=True)



	def on_online(self, stanza):
		print 'Hello in ' + self.room



	def on_offline(self, stanza):
		print "I'm so sorry =( He leaved " + self.room



	def on_presence(self, stanza):
		print 'PRESENCE in ' + self.room
		for handler in self.presence:
			try:
				handler(self, stanza)

			except Exception, e:
				print 'ERROR', e



	def on_query(self, stanza):
		print 'PRESENCE in ' + self.room
		for handler in self.presence:
			try:
				handler(self, stanza)

			except Exception, e:
				print 'ERROR', e



	def on_message(self, stanza):
		""" вызов обработчиков сообщений """
		# тут можно сформировать необходимые объекты для плагинов

		if stanza['mucnick'] != self.nick: # and self.nick in stanza['body']:
			print 'MESSAGE in ' + self.room
					
			body = unicode(stanza['body'])
			
			# поиск команд по шаблону
			match = re.search(self.keywords, body)

			# если в сообщении содержится команда, то вычленяем аргумент и выполняем команду
			if match:
				(command, arguments) = match.groups()
				print "'%s' '%s'" % (command, arguments)

				try:
					self.commands[command](self, arguments)

				except Exception, e:
					print 'ERROR', e

			# если сообщение не является командой, то вызываем обработчики сообщений
			else:
				for handler in self.message:
					try:
						handler(self, stanza)

					except Exception, e:
						print 'ERROR', e



	def send_msg(self, recipient, message, mode='groupchat'):
		print 'sending message'
		self.__nest.xmpp.send_message(mto=recipient, mbody=message, mtype=mode)

	def send_presence(self, presence):
		print 'sending presence'
		pass

	def send_iq(self, iq):
		print 'sending query'
		pass


